package tjs.study.notes.dotest.jvm.heap;

import java.io.Closeable;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class UserJvm implements Closeable {
    public static final List<UserJvm> getAwayGC = new ArrayList<>(8);

    private int id;
    private String name;

    public UserJvm(int id, String name) {
        super();
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    protected void finalize() throws Throwable {
        // finalize（）方法是对象脱逃死亡命运的最后一次机会
        System.out.println("id:" + id + ", 回收前回调finalize首次标记");
        /**
         * 将当前对象加入一个静态的常量集合中，导致当前对象能够有一个gcROOTs引用，所以不会被回收
         */
        //getAwayGC.add(this);

        // jvm承诺会调用一次finalize，但是并不会等待finalize执行完
        // 但是10秒后，方法结束完毕，依旧会被下一次gc清理掉
        // fixme 这也意味着，首次gc后，当前对象还可以存活至少10秒，可能会对后面的程序逻辑产生影响
        //Thread.sleep(9999999);
    }

    @Override
    public void close() throws IOException {
        System.out.println("清理资源(堆外)。。。");
    }
}